package com.lnt.mq.rabbitmq.confirm;

import com.lnt.mq.rabbitmq.util.RabbitConstant;
import com.lnt.mq.rabbitmq.util.RabbitUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * 开启mq监听模式
 * 监听模式只能监听发送端是否正确的将信息投递到MQ中，无法监听到消费者是否接收，
 * 即主要监听是MQ和生产者之间的关系性质,他会产生两种状态 ack和nack
 * ack:表示Broker(MQ服务)签收了消息
 * nack:表示Broker(MQ服务)拒收了消息
 * 该类扮演为生产者行为
 */
public class WeatherBureau {

    public static void main(String[] args) throws IOException, TimeoutException {

        Map<String, String> map = new HashMap<>();
        map.put("china.hunan.changsha.20220104", "中国湖南长沙20220104天气数据");
        map.put("china.hunan.changsha.20220105", "中国湖南长沙20220105天气数据");
        map.put("china.hunan.zhuzhou.20220104", "中国湖南株洲20220104天气数据");
        map.put("china.hubei.wuhan.20220104", "中国湖北武汉20220104天气数据");
        map.put("china.hubei.wuhan.20220105", "中国湖北武汉20220105天气数据");
        map.put("china.hebei.shijiazhuang.20220105", "中国河北石家庄20220105天气数据");
        map.put("china.henan.zhengzhou.20220105", "中国河南郑州20220105天气数据");
        map.put("us.cal.lsj.20220104", "美国加州洛杉矶20220104天气数据");
        map.put("us.cal.lsj.20220105", "美国加州洛杉矶20220105天气数据");
        Connection connection = RabbitUtil.getConnection();

        Channel channel = connection.createChannel();

        // 开启confirm监听
        channel.confirmSelect();
        channel.addConfirmListener(new ConfirmListener() {
            // 第二个参数：接收的数据是否是批量接收，暂时用不到
            @Override
            public void handleAck(long l, boolean b) throws IOException {
                System.out.println("消息已被MQ Broker接收");
            }

            //
            @Override
            public void handleNack(long l, boolean b) throws IOException {
                System.out.println("消息已被MQ Broker拒收");
            }
        });
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String, String> next = iterator.next();
            // param1: 交换机名称
            // param2: 消息key,作为路由key
            //....
            channel.basicPublish(RabbitConstant.EXCHANGE_WEATHER_TOPIC, next.getKey(), null, next.getValue().getBytes());
        }
    }
}
